"""
将一个事物的两个维度分离，使其可以独立地变化。

角色：
    抽象（Abstraction）
    细化抽象（RefinedAbstraction）
    实现者（Implementor）
    具体实现着（Concretelmplementor）

可将业务逻辑或一个大类拆分为不同的层次结构 ， 从而能独立地进行开发 。 层次结构中的第一层 （ 通常称为抽象部分 ） 将包含对第二层 （ 实现部分 ） 对象的引用 。

其实就是：
    1、把有"颜色的形状"拆分成二层，第一层：形状，第二层：颜色。通过形状(主)去实现颜色(辅)
    2、创建形状和颜色的抽象类，在形状的init中得到颜色对象，通过形状去形状颜色
    3、
"""
from abc import ABCMeta, abstractmethod


class Shape(metaclass=ABCMeta):  # 抽象（Abstraction）
    """形状"""

    def __init__(self, color):
        self.color = color

    @abstractmethod
    def draw(self):
        """形状"""
        pass


class Color(metaclass=ABCMeta):  # 细化抽象（RefinedAbstraction）
    """颜色"""

    @abstractmethod
    def paint(self, shape):
        pass


class Rectangle(Shape):
    """长方形"""
    name = "长方形"

    def draw(self):
        self.color.paint(self)


class Red(Color):
    def paint(self, shape):
        print("红色的", shape.name)


class Green(Color):
    def paint(self, shape):
        print("绿色的", shape.name)


rectangle = Rectangle(Green())
rectangle.draw()
